home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
ver
/
011
/
effect.c
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
2KB
|
97 lines
/* effect.c */
#include <stdio.h>
#include <xsp2lib.h>
#include "main.h"
#include "effect.h"
#define EFFECT_MAX 32 /* エフェクト最大数 */
static EFFECT effect[EFFECT_MAX]; /* ワーク */
static EFFECT *effect_top, /* 使用中のワークのリスト */
*effect_null_top; /* 空のワークのリスト */
/* ザコキャラ爆発 */
static short EffectMoveExplZako (EFFECT * p)
{
if (p->pt++ >= obj_explall + 71 + 29 - 1)
return (-1);
else
xobj_set_st (p);
return (0);
}
/* ゲーム開始時に呼ばれる */
void EffectInit (void)
{
int i;
/* リストをつなげる */
effect_top = NULL;
effect_null_top = effect;
for (i = 0; i < EFFECT_MAX; i++)
effect[i].next = &effect[i + 1];
effect[EFFECT_MAX - 1].next = NULL;
}
/* エフェクト出現時に呼ばれる */
void EffectAlloc (short type, short type2, short x, short y)
{
EFFECT *p;
if (effect_null_top == NULL)
return; /* 空きのワークがない(キャラクターオーバー) */
p = effect_null_top;
effect_null_top = p->next;
p->next = effect_top;
effect_top = p;
p->type = type;
p->type2 = type2;
p->x = x;
p->y = y;
p->pt = obj_explall + 71;
p->info = 0x0100 | PRIORITY_ZAKO_EXPL;
p->func_effect_move = EffectMoveExplZako;
}
/* 垂直同期ごとに呼ばれる */
void EffectMove (void)
{
EFFECT *p, *q;
p = effect_top; /* 現在注目しているワーク */
q = NULL; /* 1つ前のワーク(ワーク削除時に必要) */
while (p != NULL) {
/* 移動ルーチンへ飛ぶ(関数へのポインタってヤツ) */
if ((p->func_effect_move) (p)) { /* 返り値が非0なら消去 */
if (q == NULL) { /* リストの一番最初を削除 */
effect_top = p->next;
p->next = effect_null_top;
effect_null_top = p;
q = NULL;
p = effect_top;
} else {
q->next = p->next;
p->next = effect_null_top;
effect_null_top = p;
p = q->next;
}
} else {
q = p;
p = p->next;
}
}
}